package common

import (
	"crypto/md5"
	"fmt"
	"io"
	"math/rand"
	"strconv"
	"strings"
	"time"
)

// 得到随机概率下标
func GetRandomIndex(rateNum int, data []int32) (int, bool) {
	//随机一个数
	randNum := rand.Intn(rateNum) + 1
	var tempSum int
	for index, value := range data {
		tempSum += int(value)
		if tempSum > randNum {
			return index, true
		}
	}
	return 0, false
}

func Abs(n int32) int32 {
	if n >= 0 {
		return n
	}
	return -n
}

func AbsInt64(n int64) int64 {
	if n >= 0 {
		return n
	}
	return -n
}

func Float32Abs(f float32) float32 {
	if f >= 0 {
		return f
	}
	return -f
}

// Rand 随机范围 [x,y]
// 注意最大值如果是len() 需要-1,避免数组越界;
func Rand(x, y int32) int {
	return rand.Intn(int(Abs(y-x))+1) + int(x)
}

// MD5计算
func MD5(data []byte) string {
	return fmt.Sprintf("%x", md5.Sum(data))
}

func CreateToken(curtime int64, id uint64) string {
	h := md5.New()
	io.WriteString(h, strconv.FormatInt(curtime, 10))
	io.WriteString(h, strconv.FormatUint(id, 10))
	token := fmt.Sprintf("%x", h.Sum(nil))
	return token
}

func AddrConvertToIpAndPort(addr string) (string, int32, error) {
	b := strings.Split(addr, ":")
	ip := b[0]
	port, err := strconv.ParseInt(b[1], 10, 32)
	if err != nil {
		return "", 0, err
	}
	return ip, int32(port), nil
}

func SafeDelIU32(v1, v2 uint32) uint32 {
	if v1 <= v2 {
		return 0
	}

	return v1 - v2
}

func MaxI(v1, v2 int) int {
	if v1 < v2 {
		return v2
	}

	return v1
}

func MaxI32(v1, v2 int32) int32 {
	if v1 < v2 {
		return v2
	}

	return v1
}

func MaxF32(v1, v2 float32) float32 {
	if v1 < v2 {
		return v2
	}

	return v1
}

func MaxI64(v1, v2 int64) int64 {
	if v1 < v2 {
		return v2
	}

	return v1
}

func MinI(v1, v2 int) int {
	if v1 < v2 {
		return v1
	}

	return v2
}

func MinI32(v1, v2 int32) int32 {
	if v1 < v2 {
		return v1
	}

	return v2
}

func MinI64(v1, v2 int64) int64 {
	if v1 < v2 {
		return v1
	}

	return v2
}

// 获取纳秒时间的毫秒时间
func GetTimeMillisecond(v int64) int64 {
	return v / int64(time.Millisecond)
}

// 获取当前时间的毫秒
func GetCurrTimeMillisecond() int64 {
	return time.Now().UnixNano() / int64(time.Millisecond)
}

// 获取时间戳的
func GetTimeMillisecondT(t time.Time) int64 {
	return t.UnixNano() / int64(time.Millisecond)
}

// 获取时间戳（单位：秒）
func GetTimeSecondT(t time.Time) int64 {
	return t.UnixNano() / int64(time.Second)
}
